﻿
CREATE PROCEDURE [dbo].[GoodsInsert]
(
	@AssortmentId int,
	@ManufacturerId int,
	@CountryId int,
	@WholesalePack int,
	@RetailPack int,
	@ChildId int,
	@AllowUnPack bit,
	@ManufactureBarCode varchar(13),
	@FixedPrice decimal(19, 2), --Розничная цена по умолчанию
	@DefekturaAggregate bit,
	@Note varchar(250),
	@MD datetime,
	@MW varchar(50)
)
AS
DECLARE @strMsg nvarchar(500), @intRet int, @intErrCode int, @bitRefToDelete bit
DECLARE @intNextId int, @intChildRetailPack int
	SET NOCOUNT ON

IF (@AssortmentId Is Null) OR (@ManufacturerId Is Null) 
OR (@CountryId Is Null) OR (@RetailPack Is Null)
OR (@WholesalePack Is Null) OR (@AllowUnPack Is Null) OR (@DefekturaAggregate Is Null)
BEGIN
	SELECT @intErrCode = 1, @strMsg = 'Неправильные параметры в вызове процедуры ' + Object_Name(@@Procid) + ' !'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

IF EXISTS (SELECT ID FROM [CA].[Goods] 
WHERE @AssortmentId = AssortmentId 
AND @ManufacturerId = ManufacturerId 
AND @CountryId = CountryId 
AND @RetailPack = RetailPack
AND ToDelete = 0 ) 
BEGIN
	SELECT @intErrCode = 2, @strMsg = 'Дублируется товар!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

IF @ChildId IS NOT NULL
BEGIN 
--для нового родителя основные реквизиты товара берутся из потомка

	IF (@AllowUnPack <> 1)
	BEGIN
		SELECT @intErrCode = 3, 
		@strMsg = 'Для нового родительского товара необходимо установить возможность разборки!'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END

	SELECT @AssortmentId = AssortmentId, @ManufacturerId = ManufacturerId, 
	@CountryId = CountryId, @intChildRetailPack = RetailPack
	FROM CA.Goods WHERE Id = @ChildId

	IF (@@rowcount = 0)
	BEGIN
		SELECT @intErrCode = 4, @strMsg = 'Не найден дочерний товар с идентификатором ' + cast(@ChildId as varchar(10)) + ' !'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END

	IF @RetailPack <= @intChildRetailPack
	BEGIN
		SELECT @intErrCode = 5, 
		@strMsg = 'Количество в розничной упаковке для родителей должно быть больше количества у потомка с идентификатором ' + cast(@ChildId as varchar(10)) + ' !'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END

	IF (@RetailPack % @intChildRetailPack) <> 0
	BEGIN
		SELECT @intErrCode = 6, 
		@strMsg = 'Количество в розничной упаковке для родителей должно в целое число раз превосходить количество у потомка с идентификатором ' + cast(@ChildId as varchar(10)) + ' !'
		RAISERROR (@strMsg, 11, 1)
		RETURN @intErrCode
	END
	
END

IF NOT EXISTS (SELECT DepartmentId FROM PR.DepartmentOptions WHERE DepartmentId = 0 ) 
BEGIN
	SELECT @intErrCode = 7, @strMsg = 'Изменять данные спрвочников можно только в офисе!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @bitRefToDelete = ToDelete FROM CO.Manufacturers WHERE Id = @ManufacturerId
IF @@rowcount = 0
BEGIN
	SELECT @intErrCode = 8, 
	@strMsg = 'Отсутствует производитель с идентификатором ' + cast(@ManufacturerId as varchar(20)) + '!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END
IF @bitRefToDelete = 1
BEGIN
	SELECT @intErrCode = 9, 
	@strMsg = 'Производитель с идентификатором ' + cast(@ManufacturerId as varchar(20)) + ' отмечен для удаления!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @bitRefToDelete = ToDelete FROM CO.Countries WHERE Id = @CountryId
IF @@rowcount = 0
BEGIN
	SELECT @intErrCode = 10, 
	@strMsg = 'Отсутствует страна с идентификатором ' + cast(@CountryId as varchar(20)) + '!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END
IF @bitRefToDelete = 1
BEGIN
	SELECT @intErrCode = 11, 
	@strMsg = 'Страна с идентификатором ' + cast(@CountryId as varchar(20)) + ' отмечена для удаления!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

SELECT @bitRefToDelete = ToDelete FROM CA.Assortment WHERE Id = @AssortmentId
IF @@rowcount = 0
BEGIN
	SELECT @intErrCode = 12, 
	@strMsg = 'Отсутствует препарат с идентификатором ' + cast(@AssortmentId as varchar(20)) + '!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END
IF @bitRefToDelete = 1
BEGIN
	SELECT @intErrCode = 13, 
	@strMsg = 'Препарат с идентификатором ' + cast(@AssortmentId as varchar(20)) + ' отмечен для удаления!'
	RAISERROR (@strMsg, 11, @intErrCode)
	RETURN @intErrCode
END

EXEC [dbo].[ProcessStatistic] @Note OUTPUT, @MD OUTPUT, @MW OUTPUT
--получение значения идентификатора
EXEC @intRet = dbo.GetNextCounterFor 'Common', @intNextId OUTPUT
IF @intRet <> 0 RETURN @intRet

	SET NOCOUNT OFF;
INSERT INTO [CA].[Goods] ( Id, [AssortmentId], [ManufacturerId], [CountryId], [WholesalePack], [RetailPack], 
ChildId, [AllowUnPack], [ManufactureBarCode], FixedPrice, DefekturaAggregate, [Note], [MD], [MW], ToDelete) 
VALUES ( @intNextId, @AssortmentId, @ManufacturerId, @CountryId, @WholesalePack, @RetailPack, 
@ChildId, @AllowUnPack, @ManufactureBarCode, @FixedPrice, @DefekturaAggregate, @Note, @MD, @MW, 0);
	
SELECT Id, GId, AssortmentId, ManufacturerId, CountryId, WholesalePack, RetailPack, ChildId, 
AllowUnPack, ManufactureBarCode, FixedPrice, DefekturaAggregate, Note, MD, MW, ToDelete 
FROM CA.Goods WHERE (Id = @intNextId)
RETURN 0
